package gob.cgr.web.sgrh.managed;


import java.util.List;

import gob.cgr.sgrh.ejb.entidad.UnidadOrganica;
import gob.cgr.web.sgrh.service.SigerhService;
import gob.cgr.web.sgrh.util.Utilitario;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;

import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;


@ViewScoped
@ManagedBean
public class PlaneamientoMB {
	private UnidadOrganica uoSelected;
	private UnidadOrganica uoNuevo;
	private UnidadOrganica uoRaiz;
	private DefaultTreeNode arbol;
	private List<UnidadOrganica> unidadesOrganicasList;
	private TreeNode nodeSelected;
	@Inject
	private SigerhService service;
	public PlaneamientoMB() {
		// TODO Auto-generated constructor stub
	}
	
	@PostConstruct
	public void init(){
		unidadesOrganicasList=service.listarUnidadesOrganicas();
		for(UnidadOrganica uo:unidadesOrganicasList){
			if(uo.getDepende()==null){
				uoRaiz=uo;
				break;
			}
		}
		actualizarRaiz();
		System.out.println("posContruct set root "+uoRaiz);
		//generarArbolJerarquico();
	}
	
	
	public UnidadOrganica getUoSelected() {
		return uoSelected;
	}
	public void setUoSelected(UnidadOrganica uoSelected) {
		System.out.println("colocando la uo" +uoSelected);
		this.uoSelected = uoSelected;
	}
	
	public void actualizarRaiz(){
		System.out.println("actualizando la raiz");
		uoRaiz=service.obtenerUnidadOrganica(uoRaiz.getIdUnidadOrganica());
		for(UnidadOrganica u:uoRaiz.getDependienteList()){
			System.out.println(":"+u.getSiglas());
			for(UnidadOrganica uo:u.getDependienteList()){
				System.out.println("\t:"+uo.getSiglas());
			for(UnidadOrganica uo1:uo.getDependienteList())
				System.out.println("\t:"+uo1.getSiglas());
			}
		}
	}
	
	public void seleccionarUO(){
		
	}

	public void nuevo(){
		UnidadOrganica temp=uoSelected;
		uoSelected=new UnidadOrganica();
		uoSelected.setDepende(temp);
	}
	
	public void explorarUO(){
		uoRaiz=uoSelected;
		actualizarRaiz();
	}
	
	public void subirNivel(){
		System.out.println("subiendo un nivel de"+uoRaiz);
		uoRaiz=uoRaiz.getDepende();
		System.out.println("a uo :"+uoRaiz);
		actualizarRaiz();
	}
	
	public void registrar(){
	try {
			service.registrarUnidadOrganica(uoSelected);
			actualizarRaiz();
			Utilitario.mostrarMensajeExito("La operacion se ha realizado exitosamente");
		} catch (Exception e) {
			// TODO: handle exception
			Utilitario.mostrarMensajeAlerta("La operacion se ha realizado exitosamente");
		}
	}
	
	public void actualizar(){
		try {
			service.actualizarUnidadOrganica(uoSelected);
			actualizarRaiz();
			Utilitario.mostrarMensajeExito("La operacion se ha realizado exitosamente");
		} catch (Exception e) {
			// TODO: handle exception
			Utilitario.mostrarMensajeAlerta("La operacion se ha realizado exitosamente");
		}
	}

	public UnidadOrganica getUoRaiz() {
		return uoRaiz;
	}


	public void setUoRaiz(UnidadOrganica uoRaiz) {
		this.uoRaiz = uoRaiz;
	}

	public UnidadOrganica getUoNuevo() {
		return uoNuevo;
	}

	public void setUoNuevo(UnidadOrganica uoNuevo) {
		this.uoNuevo = uoNuevo;
	}

	public DefaultTreeNode getArbol() {
		return arbol;
	}

	public void setArbol(DefaultTreeNode arbol) {
		this.arbol = arbol;
	}
	
	private void generarArbolJerarquico(){
		arbol=new DefaultTreeNode("Root",null);
		TreeNode[] listaTemp=new DefaultTreeNode[unidadesOrganicasList.size()];
		int idx=0;
		//creamos todos los nodos sueltos
		for(UnidadOrganica uo : unidadesOrganicasList ){
			TreeNode nodo=new DefaultTreeNode(uo,arbol);
			listaTemp[idx++]=nodo;
		}
		//actualizamos su jerarquia
		for(int i=0;i<listaTemp.length;i++){
			TreeNode n= hallarNodoParent((UnidadOrganica)listaTemp[i].getData(), listaTemp);
			listaTemp[i].setParent(n);
			
		}
		
	}
	
	
	
	private TreeNode hallarNodoParent(UnidadOrganica uo,TreeNode[] nodo){
		TreeNode nodoBuscado=arbol;//por default sera arbol root
		for(TreeNode node :nodo){
			if(node.getData().equals(uo.getDepende())){
				nodoBuscado= node;
				//System.out.println("ok hallado padre de "+uo.getSiglas() +" de "+uo.getDepende().getSiglas());
				break;
			}
		}
		return nodoBuscado;
	}

	public TreeNode getNodeSelected() {
		return nodeSelected;
	}

	public void setNodeSelected(TreeNode nodeSelected) {
		this.nodeSelected = nodeSelected;
	}
	
}
